package com.skilltrackedu.interceptors;

import cn.hutool.core.util.StrUtil;
import com.skilltrackedu.constants.UserConstants;
import com.skilltrackedu.model.CurrentUser;
import com.skilltrackedu.utils.UserContext;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author LENOVO
 * @version 1.0
 * @date 2025/4/19 17:57
 */

public class UserInfoInterceptor implements HandlerInterceptor {

    /*
    *此拦截器不需要拦截,网关的请求到这里时已经是验证过权限的,并且token校验也没问题的
    * 所以不需要拦截,直接放行即可
    *
    * 即使是登录请求也已经在网关里面验证过了,所以也不需要再拦截
    */


    /**
     * 在请求处理之前进行预处理
     *
     * @param request 	HttpServletRequest对象，用于获取请求信息
     * @param response 	HttpServletResponse对象，用于设置响应信息
     * @param handler 	处理请求的处理器对象
     * @return boolean 	返回true表示继续执行下一个拦截器或处理器，返回false表示中断执行
     * @throws Exception 	可能抛出的异常
     *
     * 本方法主要用于在请求处理前获取用户登录信息，并将其存储到ThreadLocal中，以便后续处理过程中可以方便地访问用户信息
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取登录信息
        Long userId = Long.valueOf(request.getHeader(UserConstants.USER_INFO_USER_ID));
        String roles = request.getHeader(UserConstants.USER_INFO_ROLES);

        //判断是否获取了用户角色信息,如果有,存入ThreadLocal中
        if (StrUtil.isNotBlank(roles)) {
            UserContext.set(new CurrentUser(userId, roles));
        }

        //放行
        return true;
    }

    /**
     * 在请求完成后执行的操作
     *
     * @param request  HTTP请求对象，包含请求相关的信息
     * @param response HTTP响应对象，包含响应相关的信息
     * @param handler  处理请求的处理器对象，可以是任何对象
     * @param ex       如果处理过程中发生异常，则为异常对象；否则为null
     * @throws Exception 如果在方法执行过程中抛出异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清空ThreadLocal
        UserContext.clear();
    }
}